def initialize_questions():
    """
    此函数用于初始化宿舍生活满意度调查的问题列表
    :return: 包含调查问题的列表
    """
    questions = [
        "请对宿舍环境进行满意度评价（1-5分，1分表示非常不满意，5分表示非常满意）：",
        "请对宿舍设施进行满意度评价（1-5分，1分表示非常不满意，5分表示非常满意）：",
        "请对舍友关系进行满意度评价（1-5分，1分表示非常不满意，5分表示非常满意）：",
        "请对舍管阿姨/大叔进行满意度评价（1-5分，1分表示非常不满意，5分表示非常满意）："
    ]
    return questions


def collect_user_feedback(questions):
    """
    此函数根据问题列表收集用户的反馈，并存储在字典中。
    :param questions: 包含调查问题的列表。
    :return: 存储用户反馈的字典，键为问题，值为用户的评分。
    """
    feedback = {}  # 创建一个空字典，用于存储用户反馈
    for question in questions:  # 遍历传入的问题列表
        while True:  # 使用 while True 循环，确保用户输入有效数据
            try:
                rating = int(input(question))  # 提示用户输入一个评分，将输入转换为整数
                if 1 <= rating <= 5:  # 检查输入的评分是否在 1 到 5 之间
                    feedback[question] = rating  # 将问题作为键，评分作为值存储在 feedback 字典中
                    break  # 若输入有效，存储后跳出内层 while 循环
                else:
                    print("请输入 1 到 5 之间的分数。")  # 若输入不在 1 到 5 之间，提示用户重新输入
            except ValueError:  # 处理输入异常
                print("请输入有效的数字。")  # 若输入不是数字，提示用户输入有效数字
    return feedback  # 最终返回存储用户反馈的字典


def save_feedback_to_file(feedback, filename='宿舍生活满意度反馈.txt'):
    """
    此函数将用户反馈保存到文件中
    :param feedback: 存储用户反馈的字典
    :param filename: 存储反馈的文件名，默认为'宿舍生活满意度反馈.txt'
    """
    with open(filename, 'w', encoding='utf-8') as file:  # 以写入模式打开文件，并使用 UTF-8 编码
        for question, rating in feedback.items():  # 遍历反馈字典中的键值对
            file.write(f"{question}: {rating}\n")  # 将问题和评分以 '问题: 评分' 的格式写入文件，每行一个记录，并添加换行符


def print_user_feedback(feedback):
    """
    此函数打印用户的反馈信息
    :param feedback: 存储用户反馈的字典
    """
    print("宿舍生活满意度调查反馈：")  # 打印一个标题，表明接下来将输出用户的反馈信息
    rating_text_mapping = {
        1: "非常不满意",
        2: "不满意",
        3: "一般",
        4: "满意",
        5: "非常满意"
    }  # 创建一个字典，将评分数字映射为对应的中文描述
    for question, rating in feedback.items():  # 遍历反馈字典中的键值对
        if rating in rating_text_mapping:  # 检查评分是否在映射字典中
            print(f"{question}: {rating_text_mapping[rating]}")  # 打印问题和对应的中文描述


def main():
    """
    主函数，调用其他函数完成整个宿舍生活满意度调查流程，包括统计数据
    """
    all_feedback = []  # 创建一个空列表，用于存储所有用户的反馈信息
    num_users = int(input("请输入参与调查的用户数量："))  # 从用户处获取参与调查的用户数量并转换为整数
    for i in range(num_users):  # 根据用户数量进行循环，对每个用户进行调查
        print(f"用户 {i + 1} 的调查：")  # 打印当前用户的调查信息，例如用户 1 的调查、用户 2 的调查等
        username = input("请输入您的名字：")  # 要求用户输入用户名
        questions = initialize_questions()  # 调用 initialize_questions 函数获取问题列表
        user_feedback = collect_user_feedback(questions)  # 调用 collect_user_feedback 函数，根据问题列表收集用户反馈
        user_feedback["用户名"] = username  # 将用户名添加到用户反馈字典中
        all_feedback.append(user_feedback)  # 将用户反馈添加到 all_feedback 列表中
        save_feedback_to_file(user_feedback, filename=f'{username}_宿舍生活满意度反馈.txt')  # 调用 save_feedback_to_file 函数将用户反馈保存到以用户名命名的文件中
        print_user_feedback(user_feedback)  # 调用 print_user_feedback 函数打印用户的反馈信息


if __name__ == "__main__":
    main()